/*
 *  $Id: Resource.cs 1222 2010-12-03 13:16:20Z thenn.erannor $
 *  This file is a part of Ragima CCG.
 *  (C) 2008-2010 Ragima development group.
 *
 *  Licensed under the terms of the GNU GPL License version 2.
 *
 */

using System;

using Nereal.Extensions;
using Nereal.Serialization;

using Ragima.UI;

namespace Ragima.Serialization {
    /// <summary>
    /// Информация о ресурсах.
    /// Параметром типа является тип данных ресурса, а не сам ресурс.
    /// </summary>
    public class ResourceTypeInfo<T> : TypeInfo<Resource<T>> where T : class {
        public override bool IsUpdateable {
            get { return true; }
        }

        public override Resource<T> CreateNew() {
            return new Resource<T>(string.Empty);
        }

        public override Resource<T> Clone(Resource<T> value) {
            return value != null ? new Resource<T>(value.Id) : null;
        }

        public override bool Equals(Resource<T> a, Resource<T> b) {
            if (a == b)
                return true;
            if (a == null || b == null)
                return false;
            return a.Id == b.Id;
        }

        public override bool IsNull(Resource<T> value) {
            return value == null;
        }

        public override bool NeedSerialize(Resource<T> value, bool hasDefaultValue, Resource<T> defaultValue) {
            return value != null && !string.IsNullOrEmpty(value.Id);
        }

        public override Resource<T> ConvertFromString(string value) {
            return value;
        }

        public override void ConvertFromString(string stringValue, Resource<T> value) {
            value.Id = stringValue;
        }

        public override string ConvertToString(Resource<T> value) {
            return value.Id;
        }
    }

    /// <summary>
    /// Селектор класса информации о ресурсах.
    /// </summary>
    [TypeInfoSelector]
    public class ResourceTypeInfoSelector : ITypeInfoSelector {
        /// <summary>
        /// Третий приоритет (конкретные объекты структур данных).
        /// </summary>
        public int Priority {
            get { return 20; }
        }

        /// <summary>
        /// Проверяет, что тип является ресурсом.
        /// </summary>
        public bool Accept(Type objectType) {
            return objectType.IsGenericFrom(typeof(Resource<>));
        }

        /// <summary>
        /// Получает класс информации о ресурсе.
        /// </summary>
        public Type GetTypeInfo(Type objectType) {
            var parameters = objectType.GetGenericArguments();
            return typeof(ResourceTypeInfo<>).MakeGenericType(parameters[0]);
        }
    }
}
